package com.命令模式.案例01;



import com.命令模式.案例01.deng.GuanDengCommandImpl;
import com.命令模式.案例01.deng.KaiDengCommandImpl;
import com.命令模式.案例01.dianshi.GuanDianShiImpl;
import com.命令模式.案例01.dianshi.KaiDianShiImpl;
import com.命令模式.案例1.Comment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 命令的调用者：
 *          命令的调用者是什么意思呢：就是发起命令的人
 *          如：将军发起100人进攻命令
 *              命令：命令是客观已存在的，进攻命令、撤退命令、休息命令、等等
 *              将军：调用命令的人【将军可以调用上面已经存在的命令】，发起命令的人
 *              100名士兵：命令的执行者
 *            命令在这里就起到了链接将军和士兵之间的关系
 *          再如：遥控器电视机
 *              命令：遥控器上的每个按键，换台按键命令、调声音按键命令
 *              我：我可以按遥控器上的按钮去给电视机发送命令，我就是命令的调用者，发起命令的人
 *              电视机：具体命令的执行者
 *            遥控器将我和电视机建立了绑定
 *
 */

/**
 * Invoking：命令的调用者，即发起命令
 */
@Service
public class Invoking {

    //记录上一次的命令用来做撤销功能的
    CommandInterface undo;

    /**
     * 既然我要调用命令，那么我就的知道都有哪些命令
     * currMap集合封装所有存在的命令
     */
    @Autowired
    GuanDengCommandImpl guanDengCommand;
    @Autowired
    KaiDengCommandImpl kaiDengCommand;
    @Autowired
    GuanDianShiImpl guanDianShi;
    @Autowired
    KaiDianShiImpl kaiDianShi;
    ConcurrentHashMap<String,CommandInterface> currMap=new ConcurrentHashMap<>();
    @PostConstruct
    public void init(){
        currMap.put("gd",guanDengCommand);
        currMap.put("kd",kaiDengCommand);
        currMap.put("gds",guanDianShi);
        currMap.put("kds",kaiDianShi);
    }

    /**
     * Invoking类是命令的调用者【就是发起命令的人】
     *  Invoking调用sendCommand(String str)发起一个命令
     */
    public void sendCommand(String str){
        //执行发命令
        currMap.get(str).exce();
        undo=currMap.get(str);
    }

    /**
     * 执行撤销
     */
    public void undo(){
        this.undo.undo();
    }

}
